#pragma once

#include <map>
#include <vector>
#include <string>

#include "Item.hh"
#include "Enemy.hh"
#include "IRoom.hh"
#include "Player.hh"

// 数据管理类,负责管理游戏中的各种数据
class DataManager {
private:
    std::map<int, Item> items_;        // 存储所有道具
    std::map<int, Enemy> enemies_;     // 存储所有敌人
    std::map<int, IRoom*> rooms_;      // 存储所有房间
    std::vector<std::vector<std::vector<int>>> floors_;  // 存储所有楼层地图数据
    int currentFloor_ = 1;             // 当前楼层

public:
    // 构造和析构函数
    DataManager();
    ~DataManager();
    DataManager(const DataManager& other);
    DataManager& operator=(const DataManager& other);

    // 从文件加载游戏数据
    void loadAllItems(const std::string& filename);      // 加载所有道具
    void loadAllEnemies(const std::string& filename);    // 加载所有敌人
    void loadAllRooms(const std::string& filename);      // 加载所有房间

    // 获取游戏数据
    const std::map<int, Item>& getAllItems() const;      // 获取所有道具
    const std::map<int, Enemy>& getAllEnemies() const;   // 获取所有敌人
    IRoom* getRoom(int id) const;                        // 获取指定房间

    // 玩家相关操作
    static std::vector<Player> loadPlayers(const std::string& filename);  // 加载所有玩家
    static Player choosePlayer(const std::vector<Player>& players);       // 选择玩家

    // 地图相关操作
    void loadAllFloors(const std::vector<std::vector<std::vector<int>>>& floors);  // 加载所有楼层
    const std::vector<std::vector<int>>& getFloorMap(int floorIndex) const;        // 获取指定楼层地图

    // 设置当前楼层
    void setCurrentFloor(int floor) { currentFloor_ = floor; }
};